package com.hk.demo01;

import com.hk.bean.Student;
import com.hk.bean.User;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @author yellow Docter
 * @date 2023 -10-09
 * @desc
 *    开发的时候,如果不用spring 就是自己创建对象 ，管理对象
 *
 *    使用了spring、所有的对象的操作 都是交给spring管理
 *     1、对象的创建、对象的赋值、对象的销毁  都同意给spring
 *
 *    spring如何管理对象 ?
 *      1、spring需要创建容器
 *      2、需要把对象 添加到spring容器中
 *            1、xml 的配置   配置 对象添加ioc容器中
 *            2、注解 + 扫描   创建对象添加到ioc容器中
 *      3、从spring容器中获取对象
 *
 *  spring入门程序:
 *    1、创建一个maven、添加spring的依赖
 *    2、创建一个 application.xml 配置文件 (需要 beans 的约束)
 *    3、创建一个java类
 *    4、在 application.xml 中进行配置
 *             <bean id="user" class="com.hk.bean.User"></bean>
 *
 *    5、创建spring容器 (容器中会创建 配置的对象)
 *    6、从容器中获取对象
 *
 */
public class Demo02 {

    public static void main(String[] args) {

        // 01 spring需要创建容器
        // 通过 ClassPathXmlApplicationContext 读取 xml配置 创建容器
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("application.xml");

        //02  需要把对象 添加到spring容器中 (xml以配置)

        //03 从 容器获取对象
        //参数1: id   参数2: 类型
        User user = applicationContext.getBean("user", User.class);
        System.out.println("user = " + user);

        //从 spring 容器中获取对象
        //id  + class 获取对象
        Student stu = applicationContext.getBean("stu", Student.class);
        System.out.println("stu = " + stu);

        //通过class 获取
        Student bean = applicationContext.getBean(Student.class);
        System.out.println("bean = " + bean);

        //通过id 获取  返回的事obj类型 (需要强制转换)
        Student applicationContextBean = (Student) applicationContext.getBean("stu");
        System.out.println("applicationContextBean = " + applicationContextBean);

        //ApplicationContext 容器对象 ？
        ApplicationContext a;
        BeanFactory beanFactory;
        /**
         *  1、ApplicationContext 是  容器接口、父接口是 BeanFactory
         *  2、getBean 等这些方法都是  BeanFactory
         *
         *  3、ApplicationContext 和  BeanFactory区别?
         *    1、BeanFactory 接口是创建 bean的基本操作
         *    2、ApplicationContext 就是把  BeanFactory 进行了扩展
         *         MessageSource（国际化资源接口）
         *         资源加载 、事件发布
         */

    }

}
